﻿using System.IO;
using System.Web.UI.WebControls;
using System.Text;
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Drawing.Imaging;
using iTextSharp.text;
using iTextSharp.text.pdf;
using SeguradoraIA.Framework.EnumHelper;
using System.Linq;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Globalization;
using System.Xml.Serialization;
using System.Data;
using System.Reflection;

namespace SeguradoraIA.Framework
{
    public class Utilities
    {
        #region "CarregarGrid(GridView)"
        /// <summary>Método utilitário que carrega o Combo</summary>
        /// <param name="pGrid"></param>
        /// <param name="pDataSource"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void CarregarGrid(GridView pGrid, object pDataSource)
        {
            pGrid.DataSource = pDataSource;
            pGrid.DataBind();
        }
        #endregion

        #region "Carregar DropDownList(Combo)"
        /// <summary>Método utilitário que carrega o Combo</summary>
        /// <param name="pDropDownList"></param>
        /// <param name="pDataSource"></param>
        /// <param name="pDataTextField"></param>
        /// <param name="pDataValueField"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void CarregarDDL(DropDownList pDropDownList, object pDataSource, string pDataTextField, string pDataValueField)
        {
            pDropDownList.DataSource = pDataSource;
            pDropDownList.DataTextField = pDataTextField;
            pDropDownList.DataValueField = pDataValueField;
            pDropDownList.DataBind();
        }
        #endregion

        #region "Carregar DropDownList(Combo)"
        /// <summary>Método utilitário que carrega o Combo e Adiciona um item a lista</summary>
        /// <param name="pDropDownList"></param>
        /// <param name="pDataSource"></param>
        /// <param name="pDataTextField"></param>
        /// <param name="pDataValueField"></param>
        /// <param name="pInsert"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void CarregarDDL(DropDownList pDropDownList, object pDataSource, string pDataTextField, string pDataValueField, string pInsert)
        {
            pDropDownList.DataSource = pDataSource;
            pDropDownList.DataTextField = pDataTextField;
            pDropDownList.DataValueField = pDataValueField;
            pDropDownList.DataBind();
            pDropDownList.Items.Insert(0, new System.Web.UI.WebControls.ListItem(pInsert, string.Empty));
        }
        #endregion

        #region "Carregar ListBox"
        /// <summary>Método utilitário que carrega o ListBox</summary>
        /// <param name="pListBox"></param>
        /// <param name="pDataSource"></param>
        /// <param name="pDataTextField"></param>
        /// <param name="pDataValueField"></param>
        /// <param name="pInsert"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void CarregarListBox(ListBox pListBox, object pDataSource, string pDataTextField, string pDataValueField)
        {
            pListBox.DataSource = pDataSource;
            pListBox.DataTextField = pDataTextField;
            pListBox.DataValueField = pDataValueField;
            pListBox.DataBind();
        }

        public static void CarregarListBox(ListBox pListBox, object pDataSource)
        {
            pListBox.DataSource = pDataSource;
            pListBox.DataBind();
        }
        #endregion

        #region "Transfere Itens entre ListBox"
        /// <summary>Metodo que transfere itens entre dois ListBox</summary>
        /// <remarks>SeguradoraIA</remarks>
        /// <param name="listBoxOrigem"></param>
        /// <param name="listBoxDestino"></param>
        public static void TransfereItensListBox(ListBox listBoxOrigem, ListBox listBoxDestino)
        {
            int[] indicesSelecionados = listBoxOrigem.GetSelectedIndices();

            List<System.Web.UI.WebControls.ListItem> listaListItem = new List<System.Web.UI.WebControls.ListItem>();

            foreach (int index in indicesSelecionados)
            {
                listaListItem.Add(listBoxOrigem.Items[index]);
            }

            foreach (System.Web.UI.WebControls.ListItem listItem in listaListItem)
            {
                listBoxDestino.Items.Add(listItem);
                listBoxOrigem.Items.Remove(listItem);
            }

            listBoxOrigem.SelectedIndex = -1;
            listBoxDestino.SelectedIndex = -1;
        }
        #endregion

        #region "Metodo Alert"
        /// <summary>Metodo de Alerta. Exibe Mensagem na tela</summary>
        /// <param name="page"></param>
        /// <param name="alerta"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void Alert(System.Web.UI.Page senderPage, String vAlerta)
        {
            Alert(senderPage, vAlerta, "Mensagem");
        }

        /// <summary>Metodo de Alerta. Exibe Mensagem na tela</summary>
        /// <param name="senderPage"></param>
        /// <param name="vAlerta"></param>
        /// <param name="vNomeAlerta"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void Alert(System.Web.UI.Page senderPage, String vAlerta, String vNomeAlerta)
        {
            System.Text.StringBuilder oStringBuilder = new System.Text.StringBuilder("");

            vAlerta = vAlerta.Replace("\n", "\\n");
            vAlerta = vAlerta.Replace("\r", "\\r");
            vAlerta = vAlerta.Replace("'", "\\'");
            vAlerta = vAlerta.Replace("\"", "\\\"");

            vAlerta = string.Format("alert('{0}');", vAlerta);

            if (!(senderPage.ClientScript.IsStartupScriptRegistered(vNomeAlerta)))
            {
                senderPage.ClientScript.RegisterStartupScript(senderPage.GetType(), vNomeAlerta, vAlerta, true);
            }
        }

        /// <summary>Metodo de Alerta. Exibe Mensagem na tela</summary>
        /// <param name="senderPage"></param>
        /// <param name="vAlerta"></param>
        /// <param name="vNomeAlerta"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void Alert(System.Web.UI.UserControl senderPage, String vAlerta, String vNomeAlerta)
        {
            System.Text.StringBuilder oStringBuilder = new System.Text.StringBuilder("");

            vAlerta = vAlerta.Replace("\n", "\\n");
            vAlerta = vAlerta.Replace("\r", "\\r");
            vAlerta = vAlerta.Replace("'", "\\'");
            vAlerta = vAlerta.Replace("\"", "\\\"");

            vAlerta = string.Format("alert('{0}');", vAlerta);

            if (!(senderPage.Page.ClientScript.IsStartupScriptRegistered(vNomeAlerta)))
            {
                senderPage.Page.ClientScript.RegisterStartupScript(senderPage.GetType(), vNomeAlerta, vAlerta, true);
            }
        }

        #endregion

        #region "SqlInjection"
        public static string SqlInjection(string texto)
        {
            return texto.Replace(";", "").Replace("'", "").Replace("--", "").Trim();
        }
        #endregion

        #region "Customizar imagem"

        #region "Escreve texto na caixa de texto determinada"
        /// <summary>
        /// Escreve texto no retangulo parametrizado na imagem
        /// </summary>
        /// <param name="graphics"></param>
        /// <param name="conteudo"></param>
        /// <param name="posicaoLinha"></param>
        /// <param name="posicaoColuna"></param>
        /// <param name="largura"></param>
        /// <param name="altura"></param>
        /// <param name="alinhamentoVertical"></param>
        /// <param name="alinhamentoHorizontal"></param>
        /// <param name="nomeFonte"></param>
        /// <param name="tamanhoFonte"></param>
        /// <param name="estiloFonte"></param>
        /// <param name="corFonte"></param>
        public static void DrawImage(Graphics graphics, string conteudo, float posicaoLinha, float posicaoColuna, float largura, float altura,
                                              StringAlignment alinhamentoVertical, StringAlignment alinhamentoHorizontal, FontFamily nomeFonte, float tamanhoFonte,
                                              FontStyle estiloFonte, Brush corFonte)
        {
            RectangleF drawRect = new RectangleF(posicaoLinha, posicaoColuna, largura, altura);
            StringFormat sf = new StringFormat();
            System.Drawing.Font fonte = new System.Drawing.Font(nomeFonte, tamanhoFonte, estiloFonte);

            graphics.PageUnit = GraphicsUnit.Pixel;

            sf.Alignment = alinhamentoVertical;
            sf.LineAlignment = alinhamentoHorizontal;

            graphics.DrawString(conteudo, fonte, corFonte, drawRect, sf);
        }
        #endregion

        #region "Escreve texto no ponto determinada"
        /// <summary>
        /// Escreve texto no ponto parametrizado na imagem
        /// </summary>
        /// <param name="graphics"></param>
        /// <param name="conteudo"></param>
        /// <param name="posicaoLinha"></param>
        /// <param name="posicaoColuna"></param>
        /// <param name="alinhamentoVertical"></param>
        /// <param name="alinhamentoHorizontal"></param>
        /// <param name="nomeFonte"></param>
        /// <param name="tamanhoFonte"></param>
        /// <param name="estiloFonte"></param>
        /// <param name="corFonte"></param>
        public static void DrawImage(Graphics graphics, string conteudo, float posicaoLinha, float posicaoColuna, StringAlignment alinhamentoVertical,
                                            StringAlignment alinhamentoHorizontal, FontFamily nomeFonte, float tamanhoFonte,
                                            FontStyle estiloFonte, Brush corFonte)
        {
            PointF drawPoint = new PointF(posicaoLinha, posicaoColuna);
            StringFormat sf = new StringFormat();
            System.Drawing.Font fonte = new System.Drawing.Font(nomeFonte, tamanhoFonte, estiloFonte);

            graphics.PageUnit = GraphicsUnit.Pixel;

            sf.Alignment = alinhamentoVertical;
            sf.LineAlignment = alinhamentoHorizontal;

            graphics.DrawString(conteudo, fonte, corFonte, drawPoint, sf);
        }



        #endregion

        #region "Escreve imagem no ponto determinado da imagem, com opção de tamanho máximo"

        /// <summary>
        /// Escreve imagem no ponto determinado da imagem, com opção de tamanho máximo
        /// </summary>
        /// <param name="graphics"></param>
        /// <param name="stream"></param>
        /// <param name="posicaoLinha"></param>
        /// <param name="posicaoColuna"></param>
        /// <param name="larguraMaxima"></param>
        /// <param name="alturaMaxima"></param>
        /// <param name="alinhamentoVertical"></param>
        /// <param name="alinhamentoHorizontal"></param>
        /// <param name="nomeFonte"></param>
        /// <param name="tamanhoFonte"></param>
        /// <param name="estiloFonte"></param>
        /// <param name="corFonte"></param>
        public static void DrawImage(Graphics graphics, Stream stream, float posicaoLinha, float posicaoColuna, int? larguraMaxima, int? alturaMaxima)
        {
            Bitmap imagem = new Bitmap(stream);

            int width = imagem.Width;
            int height = imagem.Height;

            if (alturaMaxima != null)
                height = alturaMaxima.Value;

            width = imagem.Width * height / imagem.Height;


            if (larguraMaxima != null)
                width = larguraMaxima.Value;

            height = imagem.Height * width / imagem.Width;

            System.Drawing.Rectangle drawRect = new System.Drawing.Rectangle(Convert.ToInt32(posicaoLinha), Convert.ToInt32(posicaoColuna), width, height);

            graphics.DrawImage(imagem, drawRect);
        }

        #endregion

        #endregion

        #region "Imagem para PDF"

        #region "Abrir imagem para PDF"
        /// <summary>
        /// Abre PDF da imagem na pagina
        /// </summary>
        /// <param name="page"></param>
        /// <param name="imagem"></param>
        public static void OpenImageToPdf(System.Web.UI.Page page, System.Drawing.Image imagem)
        {
            MemoryStream msPdf = GereratePdfFromImage(imagem);

            page.Response.ContentType = "application/pdf";
            page.Response.BinaryWrite(msPdf.GetBuffer());
            page.Response.Flush();
            page.Response.End();
        }
        #endregion

        #region "Salvar imagem para PDF"
        /// <summary>
        /// Exporta PDF da imagem na pagina
        /// </summary>
        /// <param name="page"></param>
        /// <param name="imagem"></param>
        public static void SaveImageToPdf(System.Web.UI.Page page, System.Drawing.Image imagem)
        {
            MemoryStream msPdf = GereratePdfFromImage(imagem);

            page.Response.Clear();
            page.Response.AddHeader("Content-Disposition", "attachment; filename=Modelo_Certificado.pdf");
            page.Response.ContentType = "application/pdf";
            page.Response.BinaryWrite(msPdf.GetBuffer());
            page.Response.Flush();
            page.Response.End();
        }
        #endregion

        #region "Gerar PDF de de uma imagem "
        /// <summary>
        /// Gera PDF da imagem
        /// </summary>
        /// <param name="imagem"></param>
        /// <returns></returns>
        private static MemoryStream GereratePdfFromImage(System.Drawing.Image imagem)
        {
            Graphics graphics = Graphics.FromImage(imagem);
            graphics.PageUnit = GraphicsUnit.Point;

            MemoryStream ms = new MemoryStream();
            imagem.Save(ms, ImageFormat.Jpeg);

            byte[] bmpBytes = ms.GetBuffer();

            //cria uma instância de iTextSharp.text.Document
            Document documento = new Document();
            documento.SetPageSize(new iTextSharp.text.Rectangle(graphics.VisibleClipBounds.Width, graphics.VisibleClipBounds.Height));
            documento.SetMargins(0, 0, 0, 0);

            MemoryStream msPdf = new MemoryStream();

            //cria um Writer para o documento
            PdfWriter.GetInstance(documento, msPdf);

            //abre o documento
            documento.Open();

            //cria um objeto para imagem
            iTextSharp.text.Image imagemPdf = null;
            imagemPdf = iTextSharp.text.Image.GetInstance(bmpBytes);
            imagemPdf.ScaleAbsolute(graphics.VisibleClipBounds.Width, graphics.VisibleClipBounds.Height);

            //adiciona conteúdo
            documento.Add(imagemPdf);

            //fecha o documento
            documento.Close();

            return msPdf;
        }
        #endregion

        #endregion

        #region "Formata CPF"

        public static string FormatarCPF(string cpf)
        {
            string newCpf = "";
            string tmpCpf = "";
            tmpCpf = cpf.Trim().Replace(" ", "").Replace(".", "").Replace("-", "");
            tmpCpf = tmpCpf.PadLeft(11, '0');

            newCpf += tmpCpf.Substring(0, 3) + ".";
            newCpf += tmpCpf.Substring(3, 3) + ".";
            newCpf += tmpCpf.Substring(6, 3) + "-";
            newCpf += tmpCpf.Substring(9, 2);

            return newCpf;
        }

        #endregion

        #region "Retorna idade"
        public static string CalculaIdade(string dataNascimento)
        {
            int idade = DateTime.Now.Year - DateTime.Parse(dataNascimento).Year;
            if (DateTime.Now.Month < DateTime.Parse(dataNascimento).Month ||
               (DateTime.Now.Month == DateTime.Parse(dataNascimento).Month &&
               (DateTime.Now.Day < DateTime.Parse(dataNascimento).Day)))
                idade--;
            return idade.ToString();
        }
        #endregion

        #region "HighlightControle"
        public static void HighlightControle(System.Web.UI.Page page, ContentPlaceHolder mpContentPlaceHolder)
        {
            if (page == null)
                return;
            foreach (BaseValidator val in page.Validators)
            {
                if (val.GetType().Name.Contains("RequiredFieldValidator"))
                {
                    WebControl control = mpContentPlaceHolder.FindControl(val.ControlToValidate) as WebControl;
                    if (control != null && control.Enabled == true)
                    {
                        TextBox txt = null;
                        DropDownList ddl = null;

                        if (control is TextBox)
                        {
                            txt = (TextBox)control;
                        }
                        if (control is DropDownList)
                        {
                            ddl = (DropDownList)control;
                        }

                        if (val.Enabled)
                        {
                            control.CssClass += " rfvBackgroundColor";
                        }
                        else
                        {
                            if (txt != null)
                                txt.Attributes.Remove("onblur");

                            if (ddl != null)
                                ddl.Attributes.Remove("onblur");

                            control.Style.Remove("border");

                            if (control.CssClass.Contains("rfvBackgroundColor"))
                                control.CssClass.Replace("rfvBackgroundColor", "");
                        }
                    }
                }
            }
        }
        #endregion

        #region "Carregar DropDownList(Combo) de mês"
        /// <summary>Método utilitário que carrega o Combo e Adiciona um item a lista</summary>
        /// <param name="pDropDownList"></param>
        /// <param name="pInsert"></param>
        /// <remarks>SeguradoraIA</remarks>
        public static void CarregarDDLMes(DropDownList pDropDownList, string pInsert)
        {
            List<string> listaMeses = DateTimeFormatInfo.CurrentInfo.MonthNames.ToList();

            TextInfo ti = new CultureInfo(CultureInfo.CurrentCulture.Name).TextInfo;

            var listaMes = from x in listaMeses
                           where x != string.Empty
                           select new
                           {
                               NumMes = listaMeses.IndexOf(x) + 1,
                               NomeMes = ti.ToTitleCase(x)
                           };

            Utilities.CarregarDDL(pDropDownList, listaMes, "NomeMes", "NumMes", "- Selecione -");
        }
        #endregion

        #region "ObjectToXml"
        public static void ObjectToXml(object obj, string path_to_xml)
        {
            //serialize and persist it to it's file
            try
            {
                XmlSerializer ser = new XmlSerializer(obj.GetType());
                FileStream fs = File.Open(
                        path_to_xml,
                        FileMode.OpenOrCreate,
                        FileAccess.Write,
                        FileShare.ReadWrite);
                ser.Serialize(fs, obj);
            }
            catch (Exception ex)
            {
                throw new Exception("Could Not Serialize object to " + path_to_xml, ex);
            }
        }
        #endregion

        #region "ListToDataTable<T>"
        public static DataTable ListToDataTable<T>(IEnumerable<T> varlist)
        {
            DataTable dtReturn = new DataTable();
            PropertyInfo[] oProps = null;
            if (varlist == null) return dtReturn;
            foreach (T rec in varlist)
            {
                if (oProps == null)
                {
                    oProps = ((Type)rec.GetType()).GetProperties();
                    oProps = oProps.Where(x => x.Name.StartsWith("Id")).ToArray();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;
                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                        == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }
                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }
                DataRow dr = dtReturn.NewRow();
                foreach (PropertyInfo pi in oProps)
                {
                    dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
                    (rec, null);
                }
                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }

        #endregion
    }

}